<?php
////////////////////////////////////////////////////////////////////////////
//                                                                        //
// NOTICE OF COPYRIGHT                                                    //
//                                                                        //
// Dean`s Office for Moodle                                               //
// Электронный деканат                                                    //
// <http://deansoffice.ru/>                                               //
//                                                                        //
// Copyright (C) 2008-2999  Alex Djachenko (Алексей Дьяченко)             //
// alex-pub@my-site.ru                                                    //
// Copyright (C) 2008-2999  Evgenij Cigancov (Евгений Цыганцов)           //
// Copyright (C) 2008-2999  Ilia Smirnov (Илья Смирнов)                   // 
// Copyright (C) 2008-2999  Mariya Rojayskaya (Мария Рожайская)           // 
//                                                                        //
// This program is free software: you can redistribute it and/or modify   //
// it under the terms of the GNU General Public License as published by   //
// the Free Software Foundation, either version 3 of the Licensen.        //
//                                                                        //
// This program is distributed in the hope that it will be useful,        //
// but WITHOUT ANY WARRANTY; without even the implied warranty of         //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          //
// GNU General Public License for more details.                           //
//                                                                        //
// You should have received a copy of the GNU General Public License      //
// along with this program.  If not, see <http://www.gnu.org/licenses/>.  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

/**
 * Здесь происходит объявление класса формы, 
 * на основе класса формы из плагина modlib/widgets. 
 * Подключается из init.php. 
 */

// Подключаем библиотеки
require_once('lib.php');
// подключаем библиотеку форм
$DOF->modlib('widgets')->webform();

/** Форма создания/редактирования шаблона урока
 * 
 */
class dof_im_acl_edit_acl_form extends dof_modlib_widgets_form
{
    /**
     * @var dof_control
     */
    protected $dof;
    
    protected function im_code()
    {
        return 'acl';
    }
    
    protected function storage_code()
    {
        return 'acl';
    }
    
    protected function workflow_code()
    {
        return $this->storage_code();
    }
    
    /**
     * @see parent::definition()
     */
    public function definition()
    {
        $this->dof       = $this->_customdata->dof;
        // id учебного потока (если расписание создается для потока)
        
        // создаем ссылку на HTML_QuickForm
        $mform =& $this->_form;

        //создаем заголовок формы
        $mform->addElement('header','formtitle', $this->dof->get_string('new_acl',$this->im_code()));
        
        // добавляем новый элемент в форму
        $myselect =& $mform->addElement('hierselect', 'plugin', $this->dof->get_string('plugintype',$this->im_code()).
        										'<br>'.$this->dof->get_string('plugincode',$this->im_code()) ,null,'<br>');
        // устанавливаем для него варианты ответа
        $select1 = array( 'im' => 'im', 
        				  'storage' => 'storage',
                          'workflow' => 'workflow', 
                          'sync' => 'sync', 
                          'modlib' => 'modlib', 
                          'core' => 'core');
        $select2 = $this->get_list_previous($select1);
        $myselect->setOptions(array($select1, $select2));
        
        // код задания
        $mform->addElement('text', 'code', $this->dof->get_string('code',$this->im_code()));
        $mform->setType('code', PARAM_TEXT);    
        // код задания
        $mform->addElement('text', 'objectid', $this->dof->get_string('objectid',$this->im_code()));
        $mform->setType('objectid', PARAM_INT);    
        // родительская мандата
        $mform->addElement('select', 'aclwarrantid', 
                $this->dof->get_string('warrant', $this->im_code()).':', $this->get_list_aclwarrants());
        $mform->setType('aclwarrantid', PARAM_INT); 
        // кнопки "сохранить" и "отмена"
        $this->add_action_buttons(true, $this->dof->modlib('ig')->igs('save'));
        // применение проверки ко всем элементам
        $mform->applyFilter('__ALL__', 'trim');        
    }
    
    /** Добавление дополнительльных полей формы и установка значений по умолчанию
     * после загрузки данных в форму (если происходит редактирование)
     * 
     * @return null
     */
    public function definition_after_data()
    {

    }
    
    /** Возвращает двумерный массив типов и
     * соответствующих им кодов плагинов
     * @param array $types - список подразделений
     * @return array список кодов плагина, соответствующих данному типу
     */
    private function get_list_previous($types)
    {
        $previous = array();
        if ( ! is_array($types) )
        {//получили не массив - это значит что в базен нет ни одного подразделения
            return $previous;
        }
        foreach ($types as $type)
        {// забиваем массив данными    
            $previous[$type] = $this->get_list_value($type);
            
        }
        return $previous;
    }
    
    /** Возвращает список кодов плагина по типу плагина
     * @param int $type - id подразделения
     * @return array список кодов
     */
    private function get_list_value($type)
    {
        $code = array();
        if ( $type == 'core' )
        {// для core одоно значение 'coer'
            $codes = array('core' => 'core');
        }else
        {
            $codes = $this->dof->plugin_list_dir($type);
        }    
        foreach ( $codes as $key=>$obj )
        {
            $code[$key] = $key; 
        }
        return $code;
    }
    
    /** Получить список родительских мандат
     */
    function get_list_aclwarrants()
    {
        // найдем неархивные мандаты, которые можно наследовать
        if ( ! $aclwarrants = $this->dof->storage('aclwarrants')->get_records(array('status' => array('draft','active'))) )
        {// таких нет - вернем пустой элемент
            return $this->dof_get_select_values();
        }
        $rez = array();
        foreach ( $aclwarrants as $aclwarrant )
        {
            // отыщем хозяина мандаты
            if ( ! empty($aclwarrant->linkptype) AND ! empty($aclwarrant->linkpcode) )
            {// хозяин плагин - выведем его имя
                $note = $this->dof->get_string('title', $aclwarrant->linkpcode, null, $aclwarrant->linkptype);
            }else
            {// мандата ядра
                $note = $this->dof->get_string('core',$this->im_code());
            }
            $rez[$aclwarrant->id] = $aclwarrant->name.'['.$aclwarrant->code.']('.$note.')';
            
        }
        
        // сортируем и возвращаем
        asort($rez);
        return $this->dof_get_select_values() + $rez;
        
    }
    
    /** Проверка данных формы
     * @param array $data - данные, пришедшие из формы
     * 
     * @todo добавить проверку пересечения времени с другими уроками. Выводить
     * текст ошибки в поле begintime, вместе со ссылкой на другой шаблон
     * @todo добавить проверку прав создания объектов в подразделении
     * 
     * @return array - массив ошибок, или пустой массив, если ошибок нет
     */
    function validation($data)
    {
        // создаем ссылку на HTML_QuickForm
        $mform =& $this->_form;
        
        $errors = array();
        
        // убираем лишние пробелы со всех полей формы
        $mform->applyFilter('__ALL__', 'trim');
        
        // Возвращаем ошибки, если они есть
        return $errors;
    }
    
    /** Обработать пришедшие из формы данные
     *
     * @return bool 
     */
    public function process()
    {
        // переменная, хранящая результат операции сохранения
        $result = true;
        if ( $this->is_cancelled() )
        {//ввод данных отменен - возвращаем на страницу просмотра шаблонов
            redirect($this->dof->url_im('acl','/warrantlist.php'));
        }
        if ( $this->is_submitted() AND $formdata = $this->get_data() )
        {
            
            dof_debugging('im/acl form.php. Запрещенный в im sgl-код. Вынести в storage', DEBUG_DEVELOPER);
            $acl = new object;
            
            $acl->plugintype   = $formdata->plugin[0];
            $acl->plugincode   = $formdata->plugin[1];
            $acl->code         = $formdata->code;
            $acl->objectid     = $formdata->objectid;
            $acl->aclwarrantid = $formdata->aclwarrantid;
            if ( ! $this->dof->storage('acl')->count_records_select("plugintype=? 
                                             AND plugincode=?
                                             AND code=? AND objectid=? 
                                             AND aclwarrantid=?",(array) $acl) )
            {// если такого права еще нет - добавим';
                $result = ($result AND (bool)$this->dof->storage('acl')->insert($acl));
            }
            if ( $result )
            {// если все успешно - делаем редирект
                redirect($this->dof->url_im('acl','/warrantacl.php?id='.$acl->aclwarrantid));
            }
            return $result;
        }
    } 
    
}


/** Форма для передачи своих полномочий другим пользователей
 *
 */
class dof_im_give_warrant_acl_form extends dof_modlib_widgets_form
{
    /**
     * @var dof_control
     */
    protected $dof;

    protected function im_code()
    {
        return 'acl';
    }

    protected function storage_code()
    {
        return 'acl';
    }

    protected function workflow_code()
    {
        return $this->storage_code();
    }

    /**
     * @see parent::definition()
     */
    public function definition()
    {
        global $DOF;
        $this->dof       = $this->_customdata->dof;
        $aclwarrantid    = $this->_customdata->aclwarrantid;
        
        $rules = array();
        
        // получаем массив прав по id доверенности
        if ($list = $DOF->storage('acl')->get_records(array(
                'aclwarrantid' => $aclwarrantid)))
        {
            foreach ($list as $rule)
            {
                $rules[] = array('value' =>$rule->plugintype.'_'.$rule->plugincode.'_'.$rule->code); 
            }
        }

        // создаем ссылку на HTML_QuickForm
        $mform =& $this->_form;

        //создаем заголовок формы
        $mform->addElement('header','formtitle', $this->dof->get_string('give_warrant',$this->im_code()));
        
        // hidden поле с id доверенности
        $mform->addElement('hidden', 'aclwarrantid', $aclwarrantid);
        
        // hidden поля с id персон
        $personids = '0';
        if (!empty($this->_customdata->personids))
        {
            $personids = $this->_customdata->personids;
        }
        
        $mform->addElement('hidden', 'personids', $personids);
        
        $mform->addElement('text', 'warrantname', $this->dof->get_string('warrant_name',$this->im_code()), 
                array('maxlength' => '64', 'size' => '18'));
        
        $mform->addElement('textarea', 'warrantnote', $this->dof->get_string('warrant_notice',$this->im_code()),
                array('wrap' => 'virtual', 'cols' => '50', 'rows' => '10'));
        
        $mform->addElement('date_selector', 'warrantbegin', $this->dof->get_string('warrant_duration_begin',$this->im_code()));
        $mform->addElement('date_selector', 'warrantend', $this->dof->get_string('warrant_duration_end',$this->im_code()));
        
        $options = array('forbid' => $this->dof->get_string('warrant_regive_forbid', $this->im_code()),
                'allow' => $this->dof->get_string('warrant_regive_allow', $this->im_code()));
        
        $mform->addElement('select', 'warrantregive', $this->dof->get_string('warrant_regive', $this->im_code()),
                $options);
        
        // таблица с правами-чекбоксами
        $mform->addElement('html', '<br/><br/><table width="70%" align="left">');
        $mform->addElement('html', '<caption><b>'.$this->dof->get_string('warrant_select_acls', $this->im_code()).
                '</b></caption>');
        
        foreach ($rules as $rule)
        {
            $mform->addElement('html', '<tr>');
            for ($i = 0; $i < 2; $i++)
            {
                $mform->addElement('html', '<td>');
                $mform->addElement('checkbox', $rule['value'], '', "&nbsp;&nbsp;".$rule['value']);
                $mform->addElement('html', '</td>');
            }
            $mform->addElement('html', '</tr>');
        }
        
        $mform->addElement('html', '<tr><td colspan="1" align="right">');
        $mform->addElement('submit', 'submit', $this->dof->get_string('warrant_submit', $this->im_code()));
        $mform->addElement('html', '</td></tr>');
        
        $mform->addElement('html', '</table>');
    }

    /** Добавление дополнительльных полей формы и установка значений по умолчанию
     * после загрузки данных в форму (если происходит редактирование)
     *
     * @return null
     */
    public function definition_after_data()
    {

    }
    
    /** Проверка данных формы
     * @param array $data - данные, пришедшие из формы
     *
     * @todo добавить проверку пересечения времени с другими уроками. Выводить
     * текст ошибки в поле begintime, вместе со ссылкой на другой шаблон
     * @todo добавить проверку прав создания объектов в подразделении
     *
     * @return array - массив ошибок, или пустой массив, если ошибок нет
     */
    function validation($data)
    {
        // создаем ссылку на HTML_QuickForm
        $mform =& $this->_form;

        $errors = array();

        // убираем лишние пробелы со всех полей формы
        //$mform->applyFilter('__ALL__', 'trim');

        // Возвращаем ошибки, если они есть
        return $errors;
    }

    /** Обработать пришедшие из формы данные
     *
     * @return bool
     */
    public function process()
    {
        $mform =& $this->_form;
        
        $data = $this->get_data();
        
        // убираем лишние пробелы со всех полей формы
        $mform->applyFilter('__ALL__', 'trim');
        
        // складываем чекбоксы в отдельный массив
        $flags = array();
        foreach ($data as $key => $value)
        {
            $tmp = explode('_', $key);
        
            if ($tmp[0] == 'im' OR $tmp[0] == 'storage' OR $tmp[0] == 'workflow')
            {
                $flags[$key] = $value;
            }
        }
        
        // проводим проверку параметров 
        if (!isset($data->warrantname) OR empty($data->warrantname))
        {
            return false;
        
        }else if (!isset($data->warrantnote) OR empty($data->warrantnote)) 
        {
            return false;
            
        }else if (!isset($flags) OR empty($flags))
        {
            return false;
        
        }else if (!isset($data->warrantbegin) OR empty($data->warrantbegin))
        {
            return false;
        
        }else if (!isset($data->warrantend) OR empty($data->warrantend))
        {
            return false;
        
        }else if (!isset($data->warrantregive) OR empty($data->warrantregive))
        {
            return false;
        
        }else if (!isset($data->personids) OR empty($data->personids))
        {
            return false;
        
        }else if (!isset($data->aclwarrantid) OR empty($data->aclwarrantid))
        {
            return false;
        }
        
        return true;
    }

}


?>